﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sebrae.Academico.InfraEstrutura.Core;
using Sebrae.Academico.Trilhas.Dominio.Classes;
using Sebrae.Academico.InfraEstrutura.Core.UnitOfWork;
using NHibernate.Linq;
using Sebrae.Academico.InfraEstrutura.Core.Helper;

namespace Sebrae.Academico.Trilhas.BM.Classes
{
    public class BMTrilhaAtividadeInformativaParticipacao: BusinessManagerBase
    {


        private RepositorioBase<TrilhaAtividadeInformativaParticipacao> repositorio;

        public BMTrilhaAtividadeInformativaParticipacao(IUnitOfWork unitOfWork): base()
        {
            try
            {
                repositorio = new RepositorioBase<TrilhaAtividadeInformativaParticipacao>(unitOfWork);
            }
            catch (Exception ex)
            {
                ExceptionHandler.TratarExcecao(ex);
            }
        }

        public void InserirAtividadeFormativaParticipacao(TrilhaAtividadeInformativaParticipacao pAtividade)
        {
            try
            {
                pAtividade.DataAlteracao = DateTime.Now;
                repositorio.Salvar(pAtividade);
            }
            catch (Exception ex)
            {
                ExceptionHandler.TratarExcecao(ex);
            }
        }

        public void ValidaAtividadeFormativaParticipacao(TrilhaAtividadeInformativaParticipacao atividade)
        {


            if (atividade.TrilhaTopicoTematico == null)
            {
                throw new Exception("Erro ao gravar a Atividade Formativa. Topico Temático não informado.");
            }

            if (atividade.UsuarioTrilha == null)
            {
                throw new Exception("Erro ao gravar a Atividade Formativa. Usuário da Trilha não informado.");
            }
            

            if (!string.IsNullOrWhiteSpace(atividade.TextoParticipacao))
            {
                if (!string.IsNullOrWhiteSpace(atividade.TipoArquivoParticipacao) ||
                    !string.IsNullOrWhiteSpace(atividade.NomeCaminhoArquivoParticipacao) ||
                    !string.IsNullOrWhiteSpace(atividade.ArquivoParticipacao))
                {
                    throw new Exception(@"Erro ao gravar a Atividade Formativa. Não é permitido a informação do Texto de Participação e 
                                     os dados de um arquivo para a mesma atividade. Verifique os dados Informados.");

                }
                
            }
            else 
            {
                if (string.IsNullOrWhiteSpace(atividade.TipoArquivoParticipacao))
                {
                    throw new Exception("Erro ao gravar a Atividade Formativa. Tipo de Arquivo não informado.");
                    
                }
       
                else if (string.IsNullOrWhiteSpace(atividade.NomeCaminhoArquivoParticipacao)) 
                {
                    throw new Exception("Erro ao gravar a Atividade Formativa. Caminho do Arquivo não informado.");
                
                }

                else if (string.IsNullOrWhiteSpace(atividade.ArquivoParticipacao))
                {
                    throw new Exception("Erro ao gravar a Atividade Formativa. Nome do Arquivo não informado.");
             
                }

               

            }

        }



        public IList<TrilhaAtividadeInformativaParticipacao> ObterTrilhaAtividadeFormativaParticipacaoPorFiltro(TrilhaAtividadeInformativaParticipacao pAtividade)
        {
            IList<TrilhaAtividadeInformativaParticipacao> ListaAtividade = null;

            try
            {
                var query = repositorio.Session.Query<TrilhaAtividadeInformativaParticipacao>();

                if (pAtividade != null)
                {

                    

                    if (pAtividade.ID != 0)
                    {
                        query = query.Where(x => x.ID == pAtividade.ID);
                    }

                    if (!string.IsNullOrWhiteSpace(pAtividade.ArquivoParticipacao))
                    {
                        query = query.Where(x => x.ArquivoParticipacao == pAtividade.ArquivoParticipacao);
                    }

                    if (!string.IsNullOrWhiteSpace(pAtividade.NomeCaminhoArquivoParticipacao))
                    {
                        query = query.Where(x => x.NomeCaminhoArquivoParticipacao == pAtividade.NomeCaminhoArquivoParticipacao);
                    }

                    if (!string.IsNullOrWhiteSpace(pAtividade.Status))
                    {
                        query = query.Where(x => x.Status == pAtividade.Status);
                    }

                    if (!string.IsNullOrWhiteSpace(pAtividade.TextoParticipacao))
                    {
                        query = query.Where(x => x.TextoParticipacao == pAtividade.TextoParticipacao);
                    }

                    if (!string.IsNullOrWhiteSpace(pAtividade.TipoArquivoParticipacao))
                    {
                        query = query.Where(x => x.TipoArquivoParticipacao == pAtividade.TipoArquivoParticipacao);
                    }

                    if (pAtividade.TrilhaTopicoTematico != null)
                    {
                        query = query.Where(x => x.TrilhaTopicoTematico == pAtividade.TrilhaTopicoTematico);
                    }

                    if (pAtividade.Usuario != null)
                    {
                        query = query.Where(x => x.Usuario == pAtividade.Usuario);
                    }

                    if (pAtividade.UsuarioTrilha != null)
                    {
                        query = query.Where(x => x.UsuarioTrilha == pAtividade.UsuarioTrilha);
                    }

                }

                /* O Fetch faz o inner join / left outer join para buscar os dados do usuario.
                   O método CriarSessionFactory da classe NHibernateHelper possui a instrução
                   .UseOuterJoin() para indicar ao NHibernate que o left outer join será utilizado 
                   nas queries */
                query = query.Fetch(x => x.UsuarioTrilha);
                query = query.Fetch(x => x.TrilhaTopicoTematico);

                ListaAtividade =  query.AsParallel().ToList<TrilhaAtividadeInformativaParticipacao>().ToList();

                return ListaAtividade;


            }
            catch (System.Exception ex)
            {
                ExceptionHandler.TratarExcecao(ex);
                return null;
            }
        }
    }
}
